import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import warnings
import openpyxl
from openpyxl import load_workbook

import xlrd
import xlwt
import re

要货计划表路径 = '../文件/开单分析表-N039 PC 6.11.xlsx'
料号对应海外采购表路径 = '../文件/料号对应海外采购表.xlsx'


def dataDoing():
    # 获取要货计划表中的客户料号和对应时间数据,获取对应的SAP料号
    readPlanDate = pd.read_excel(要货计划表路径, dtype=str)
    PlanDate1 = readPlanDate[['机型', '物料编码', '物料描述']]
    # 利用正则表达式获取到表头为时间类型的列
    date_pattern = r'\d{4}-\d{2}-\d{2}'
    column_names = readPlanDate.columns[
        readPlanDate.columns.str.contains(date_pattern, case=False, na=False, regex=True)]
    PlanDate2 = readPlanDate[column_names]
    # 将两个表数据进行合并
    concatDate = pd.concat([PlanDate1, PlanDate2], axis=1)
    print(f'获取到要货计划表中{len(concatDate)}条数据')

    # 读取成品料号对应表sheet页的数据
    readSAPNumber = pd.read_excel(料号对应海外采购表路径, sheet_name='成品料号对应表', dtype=str)
    readPlanDate.rename(columns={'物料编码': '客户料号'}, inplace=True)

    # 拼接两个表,得到客户料号对应的SAP料号
    mergeDate = pd.merge(readPlanDate['客户料号'], readSAPNumber, how='left', on=['客户料号'], indicator=True)
    resultDate = mergeDate[mergeDate['_merge'].isin(['both'])].drop(columns=['_merge'])
    print(resultDate)
    print(f'能够获取到客户料号对应SAP料号的有{len(resultDate)}条数据')

    # 将SAP料号数据转换为列表
    SAPNmuberList = resultDate['SAP料号'].values.tolist()
    print(f'将SAP料号转换为列表:{SAPNmuberList}')


# dataDoing()

库龄报表文件路径 = '../文件/库龄报表2024-06-21_1718938044.xlsx'
销售订单清单文件路径 = '../文件/销售订单清单2024-06-21_1718938094.xlsx'


def concatAllDate():
    pd.set_option('display.max_columns', None)
    # 获取要货计划表中的客户料号和对应时间数据,获取对应的SAP料号
    readPlanDate = pd.read_excel(要货计划表路径)
    PlanDate1 = readPlanDate[['机型', '物料编码', '物料描述']]
    # 利用正则表达式获取到表头为时间类型的列
    date_pattern = r'\d{4}-\d{2}-\d{2}'
    column_names = readPlanDate.columns[
        readPlanDate.columns.str.contains(date_pattern, case=False, na=False, regex=True)]
    timecolumn = column_names.values.tolist()

    # 将两个表数据进行合并
    PlanDate2 = readPlanDate[column_names]
    PlanDate2.fillna(0, inplace=True)
    for column in timecolumn:
        PlanDate2[column].astype(float)
    concatDate = pd.concat([PlanDate1, PlanDate2], axis=1)
    # print(concatDate)
    print(f'获取到要货计划表中{len(concatDate)}条数据')
    concatDate.rename(columns={'物料编码': '客户料号'}, inplace=True)

    # 读取成品料号对应表sheet页的数据
    readSAPNumber = pd.read_excel(料号对应海外采购表路径, sheet_name='成品料号对应表', dtype=str)

    # 拼接两个表,得到客户料号对应的SAP料号
    mergeDate = pd.merge(readSAPNumber[['SAP料号', '客户料号', '开单周期']], concatDate, how='right', on=['客户料号'],
                         indicator=True)
    resultDate = mergeDate[mergeDate['_merge'].isin(['both'])].drop(columns=['_merge'])
    resultDate.fillna(0, inplace=True)
    sums = []

    # 遍历表中的每一行数据
    for index, row in resultDate.iterrows():
        nowday = datetime.now().date()
        # 使用正则表达式查找连续的数字
        match = re.search(r'\d+', row['开单周期'])
        # 如果找到了匹配项
        if match:
            # 获取匹配到的数字字符串
            times = int(match.group())
        else:
            times = 0
            print("没有找到数字")
        timeList = []
        #从今天nowday开始,循环times次,把每天的数据相加起来
        for i in range(0, times):
            today = nowday.strftime('%Y-%m-%d')
            if (today in timecolumn):
                timeList.append(today)
            nowday += timedelta(days=1)
        sum_value = row[timeList].sum()
        sums.append(sum_value)
    #定义'需求'列的数据
    resultDate['需求'] = sums
    # print(resultDate)
    return resultDate


# concatAllDate()


def dateDoing():
    库存和SO中间表='../文件/库存和SO数据中间表.xlsx'
    # 读取库龄报表文件路径中的数据
    readExcelDate1 = pd.read_excel(库龄报表文件路径,dtype={'料件编号':str})
    readExcelDate1=readExcelDate1[readExcelDate1['工厂'].notna()]
    StockDate = readExcelDate1[['料件编号', '品名', '规格', '库存单位', '库存数量','旧物料号']]
    # 存在料号相同的数据,需要将库存数量相加起来
    aggStockMap = {'料件编号': 'first', '品名': 'first', '规格': 'first', '库存单位': 'first', '库存数量': 'sum','旧物料号':'first'}
    groupStockDate = StockDate.groupby('料件编号').agg(aggStockMap).reset_index(drop=True)
    groupStockDate.rename(columns={'料件编号':'SAP料号','品名':'物料描述','旧物料号':'ERP旧料号'},inplace=True)
    print(f'读取库龄报表文件后共有{len(groupStockDate)}条数据')

    # 读取销售订单清单文件路径中的数据
    readExcelDate2 = pd.read_excel(销售订单清单文件路径,dtype={'物料':str})
    SaleDate = readExcelDate2[
        ['物料', '项目描述', '订单类型', '销售单位', '订单数量', '合约单已转单量', '合约单剩余可转']]
    # 先筛选出订单类型为'ZHY'的数据,  然后将存在料号相同的数据,需要将库存数量相加起来
    screenSaleDate = SaleDate[SaleDate['订单类型'].isin(['ZHY'])]
    aggSaleMap = {'物料': 'first', '项目描述': 'first', '订单类型': 'first', '销售单位': 'first', '订单数量': 'sum',
                  '合约单已转单量': 'sum', '合约单剩余可转': 'sum'}
    groupSaleDate = screenSaleDate.groupby('物料').agg(aggSaleMap).reset_index(drop=True)
    groupSaleDate.rename(columns={'物料':'SAP料号','合约单剩余可转':'SO'},inplace=True)
    print(f'读取销售订单清单文件后共有{len(groupSaleDate)}条数据')

    #将读取的库龄报表文件 和 销售订单清单文件的数据通过'SAP料号'进行合并到一个表中
    mergeDate=pd.merge(groupStockDate,groupSaleDate,how='outer',on=['SAP料号'])
    mergeDate['物料描述'].fillna(mergeDate['项目描述'],inplace=True)
    print(mergeDate)
    mergeDate['库存数量'].fillna(0,inplace=True)
    #存储到一个中间表中,方便后期查看运行结果
    mergeDate.to_excel(库存和SO中间表)

    #调用concatAllDate函数，获取需求数量结果
    resultDate = concatAllDate()

    #拼接调用函数的结果数据
    mergeAllDate=pd.merge(resultDate,mergeDate[['SAP料号','库存数量','SO','ERP旧料号']],how='left',on=['SAP料号'])
    mergeAllDate.fillna(0,inplace=True)
    mergeAllDate['需求-SO']=mergeAllDate['需求']- mergeAllDate['SO']
    # print(mergeAllDate.columns.tolist())
    # 利用正则表达式获取到表头为时间类型的列
    date_pattern = r'\d{4}-\d{2}-\d{2}'
    column_names = mergeAllDate.columns[
        mergeAllDate.columns.str.contains(date_pattern, case=False, na=False, regex=True)]
    timecolumn = column_names.values.tolist()
    #定义一些普通需要获取的列
    column_head=['机型','客户料号', '物料描述', 'ERP旧料号','SAP料号',  '开单周期','库存数量', '需求',  'SO', '需求-SO']
    #定义一个表头的map类,方便后面取列表数据
    index=0
    开单数据表头map={}
    for item in column_head:
        开单数据表头map[item]=index
        index+=1
    print(开单数据表头map)

    表头列表=column_head+timecolumn #合并两个列表
    print(表头列表)
    #获取数据,重新用表头排列,
    resultInsertDate=mergeAllDate[表头列表]
    结果数据列表=resultInsertDate.values.tolist()
    print(f'整理后的最终结果共有{len(结果数据列表)}条数据')
    # print(resultInsertDate)

dateDoing()
